﻿//147. 对链表进行插入排序
//给定单个链表的头 head ，使用 插入排序 对链表进行排序，并返回 排序后链表的头 。
//插入排序 算法的步骤 :
//插入排序是迭代的，每次只移动一个元素，直到所有元素可以形成一个有序的输出列表。
//每次迭代中，插入排序只从输入数据中移除一个待排序的元素，找到它在序列中适当的位置，并将其插入。
//重复直到所有输入数据插入完为止。
//下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时，从输入数据中删除一个元素(红色)，并就地插入已排序的列表中。
//对链表进行插入排序。




/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head)
    {
        ListNode hair(INT_MIN);
        while (head)
        {
            int x = head->val;
            auto p = &hair;
            while (p->next && p->next->val < x)
            {
                p = p->next;
            }
            auto n = head->next;
            head->next = p->next;
            p->next = head;
            head = n;
        }
        return hair.next;
    }
};